<?php 
/**
 * ... ...
 * ... ...
 *
 */ 



// 载入父 类 
//<<[UnmodifiableBlock.Start]::Include Parent Class::>>//
JCAT_Package::ImportClass('JCAT_UIGtkCtrlTree',JCAT::PACKAGE_UICTRLGTK) ;
//<<[UnmodifiableBlock.End]::Include Parent Class::>>//

// 载入所需的 数据校验器 类 
//<<[UnmodifiableBlock.Start]::Include Data Verifier Class::>>//

//<<[UnmodifiableBlock.End]::Include Data Verifier Class::>>//

/**
 * JCAT_UIGtkCtrlTree 类型UI控件 TreeUseColumns 
 * 
 * @access	public
 * @author	由 JeCat PHP Toolbox 产生 
 */
class TreeUseColumns 
	//<<[UnmodifiableBlock.Start]::Extends::>>//
	extends JCAT_UIGtkCtrlTree 
	//<<[UnmodifiableBlock.End]::Extends::>>//
{
	/**
	 * TreeUseColumns类 的 构造函数 
	 * 
	 * @access	public
	 * @return	void
	 */
	public function TreeUseColumns()
	{
		// 初始化 父类 
		//<<[UnmodifiableBlock.Start]::Init Parent Class::>>//
		$this->JCAT_UIGtkCtrlTree(__CLASS__,JCAT_Language::Sentence("*"),'TreeUseColumns') ; 
		//<<[UnmodifiableBlock.End]::Init Parent Class::>>//

		// 创建并载入 数据校验器 
		//<<[UnmodifiableBlock.Start]::Data Verifier::>>//

		//<<[UnmodifiableBlock.End]::Data Verifier::>>//


		// 在此添加 初始化 代码 
		// TODO ... ...
		
		$this->aDBColumnModel = new GtkTreeStore(Gtk::TYPE_STRING,Gtk::TYPE_STRING) ;

	}
	
	/**
	 * 创建一个  GtkTreeModel 模型  
	 * 
	 * @access	public
	 * @return	void
	 */
	public function CreateModel()
	{
		//<<[UnmodifiableBlock.Start]::Create Model::>>//
		$aModel = new GtkTreeStore(
			Gtk::TYPE_STRING
			) ;
		//<<[UnmodifiableBlock.End]::Create Model::>>//
		
		// 在此添加代码  
		// TODO ... ...
		
		return $aModel ;
	}
	
	/**
	 * 初始化  GtkTreeView 的列  
	 * 
	 * @access	public
	 * @return	void
	 */
	public function InitializeColumns()
	{
		// 取得视图 
		$wndTreeView = $this->GetMainWidget() ;
		JCAT_ASSERT::ASSERT_INSTANCE($wndTreeView,'GtkTreeView',
					JCAT_Language::SentenceEx('UI控件“%”的主窗体尚未创建，在正常情况下  InitializeColumns()不应该被直接调用，UI控件的主窗体在创建之时，会自动调用此方法。','JCAT',null,$this->GetName())) ;

		// 设置 视图上的 各列 
		//<<[UnmodifiableBlock.Start]::Setting Columns::>>//
		// 视图列：数据表/字段 名称
		$aRenderForColumn0 = new GtkCellRendererCombo() ;
		$aRenderForColumn0->set_property('editable',true) ;
		$aRenderForColumn0->connect('edited',array($this,'OnTextEdit'),self::CLM_NAME) ;
		$wndColumn0 = new GtkTreeViewColumn(JCAT_Language::Sentence('数据表/字段 名称'),$aRenderForColumn0,'text',self::CLM_NAME) ;
		$wndTreeView->append_column($wndColumn0) ;
		//<<[UnmodifiableBlock.End]::Setting Columns::>>//
		

		// 在此添加 代码 
		// TODO ... ...
		$aRender = $this->GetCellRender(self::CLM_NAME) ;
		$aRender->set_property('model',$this->aDBColumnModel) ;
		$aRender->set_property('text_column',1) ;

		$this->InsertActiveRow() ;
	}
	
	/**
	 * what's this
	 * 
	 * @access	public
	 * @param	$aRenderer		GtkCellRendererText		what's this
	 * @param	$sPath			string					what's this
	 * @param	$sNewText		string					what's this
	 * @param	$nColumn		int						what's this
	 * @return	void
	 */
	public function OnTextEdit( GtkCellRendererText $aRenderer , $sPath, $sNewText, $nColumn )
	{
		$aModel = $this->GetGtkModel() ;
		$aItem = $aModel->get_iter($sPath) ;
		$aParentItem = $aItem? $this->GetParentItem($aItem): null ;
		// $aModel = new GtkTreeStore() ;
		
		// 删除行
		if( $sNewText==='' )
		{
			$aModel->remove($aItem) ;
			// return ;
		}
		
		// 编辑新插入行
		else 
		{
			// 不能选择数据表
			if( strstr($sNewText,'.')===false )
			{
				JCAT_Gtk::MsgDlg(JCAT_Language::Sentence('请选择字段')) ;
				return ;
			}
			
			// 不允许重复
			$aIterator = $this->CreateItemIterator(null,0) ;
			$aIterator->First() ;
			while( !$aIterator->IsDone() )
			{
				$aTheItem = $aIterator->Current() ;
				
				$sClmName = $aModel->get_value($aTheItem,self::CLM_NAME) ;

				if( $sClmName==$sNewText and !$this->IsSameItem($aItem,$aTheItem) )
				{
					JCAT_Gtk::MsgDlg(JCAT_Language::Sentence('不能重复使用同一字段：%s',$sClmName)) ;
					return ;
				}
				
				$aIterator->Next() ;
			}
			
			// 
			parent::OnTextEdit($aRenderer,$sPath,$sNewText,$nColumn) ;
			
		}
	
		// 将最后一行置为 空行
		$aLastItem = $this->GetLastItem($aParentItem,false) ;
		if( !$aLastItem )
		{
			$this->InsertActiveRow() ;
		}
		else
		{
			$sLastName = $aModel->get_value($aLastItem,self::CLM_NAME)=='' ;
			if(!$sLastName)
			{
				$this->InsertActiveRow() ;
			}
		}
	
		
	}
	
	/**
	 * what's this
	 * 
	 * @access	protected
	 * @return	void
	 */
	protected function InsertActiveRow()
	{
		$aModel = $this->GetGtkModel() ;
		$aNewItem = $aModel->append(null,array('')) ;
		
		$wndTree = $this->GetMainWidget() ;
		$wndTree->set_cursor( $aModel->get_string_from_iter($aNewItem) ) ;
		// $this->EditCell($aNewItem,self::CLM_NAME) ;
	}

	
	
	/**
	 * what's this
	 * 
	 * @access	public
	 * @return	void
	 */
	public function SetColumns( $arrTableColumns )
	{
		$this->aDBColumnModel->clear() ;
		
		foreach ($arrTableColumns as $arrTableName=>$arrColumns)
		{
			$aTableItem = $this->aDBColumnModel->append(null,array(self::TYPE_TABLE,$arrTableName));
			
			foreach ($arrColumns as $sColumn)
			{
				$this->aDBColumnModel->append($aTableItem,array(self::TYPE_COLUMN,"{$arrTableName}.{$sColumn}"));
			}
		}
	}

	// 为 视图的列 定义常量 
	//<<[UnmodifiableBlock.Start]::Define Column Consts::>>//
	const CLM_NAME = 0 ;
	//<<[UnmodifiableBlock.End]::Define Column Consts::>>//

	const TYPE_TABLE = 1 ;
	const TYPE_COLUMN = 2 ;
	
	
	/**
	 * 
	 * 
	 * @access	private
	 * @var		GtkTreeStore
	 */
	private $aDBColumnModel ;

	
	
}






?><?
/**
 * [注意!!]
 *	以下内容由 JCAT PHP Toolbox 自动维护，手动更改的内容会被 JCAT PHP Toolbox 抹除，
 *	同时还可能破坏格式，导致 JCAT PHP Toolbox 无法正常读取。
 */
/*<<[UnmodifiableBlock.Start]::Coder Dialog Data::>>&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&//
<<{{DocumentClass:UICtrlGtkTreeDoc}}>>
eCVEQXVSTW8lRDMlNDAlMTAlQkQlMjMlRjElMUYlRTglMUUlOTElQzglQzZOJUZBJUMxJUI4JUFBJTk0biU5MmJTJTVCSSVFQiUwRCVFMiUxNG0lOUMlODVsYiU3QiUyMyVEQiUyNSU4RCUyQyVGRiU4NEolNUMlMTBnTnAlQTElRUElODUlOUYlRDQlQzAlQ0YlNjAlRDclOEUtJTkwJUUwMCU5MiUzRG9mJURFJTlCJUI3
JUMzJUMwJTg0JTNDJTg1LiVBMCUzRSVDQiUxOCVCMiUxOCUxQyVFQiU3RiVFMyUyNStqJTkzJTJDJTA5JUVEaCUxRCVGMiU4OCVDNyU5OSVCRiU1RHNkJTA5MCUyQyUwNSUxRiVENjAlMDlZJTlBJThFWCVCNiVEMCVBRCUwNiVFNCUwMiVEQSUxQTclMEMlNDB4JTIxJTIzJThFWSVDODklMUUlMjVyJUM5JTgzJTBDJTNC
JTlDJUIwJTBDJThGJTVFJThEJTdDJTI5JUMzJTk5JUJDJUM1ZSUzQk8xJTkxcyU5RSVFMCVCRSUwQ240JTE1JUVFJTlGNyU5RnYlOUNmJTJDJTBFeCVBQiVFMktxJUEwJTVCWiU3RSVDMjlNOSU5MSVFMU0lMTQlQTclQUQlRjViJThEJUFDQiUxMSVCN2thJUFGRSUzQ0daJUNBJTA5KyU4NyVGNCVGQyUyOSVCNSUyRiVC
MiU5NUZ0ayU4OTQlQjUlMUUlOEIlQUElOEMlQjIlRTElRUYlQzElM0ElN0IlMEMlQTglRjlrdmRwJUEyJTdEUiVDMyU4MyU4NSUwOCVFNyUwOSU4RjUlRDglODYlQkMlQTglMUMwJTNCJTgwdiU5RiUxRXZ3JUY3JUJGJUJFJTdDJUMzJThGJURGJTNGJUVGJUVFJTdGJTNDJTdCJUZDeCVGNyVGMyVFQkNjJUUyJTExKyUy
NSUwOSVDMCU3RiUzQiUxQUwlQUYlRkQlMkIlREIlQkIlRDAlOTglQjklRDdGZDQlOTMlODM4SyVCNiUzQSVEQiVCMWYlQUFLJTQwJUQ3JTJBWSVDOSVBNSUzQiVGNXolRUUlNDBDJTg3JTdCJUU4SCVDNSUwQiVDMyUyQSU4QWolRUJqNyU5NyU4OSVGOCU4RCU5OCVCRiVFNyU5OSVERCVGRiVGRiU4RSU4NlklRDdTJUJC
cSUwMyVEMCVGMyVEMlRNJUY3JUM3JTkyJThEJTAzJTFEJUVEJTgwJUJBJTg0JUYyRXQlODclRDklREUlN0IlRERLJTk0JTJCJTFGeCVGRCU4OCUxQVMlQjQlRjElN0UlQjBpViVENzYlRTElODl4JTI3eCVBMnQlODQlRUElM0ElODQlOEMlRjclODUlRjMlRjIlMTQlOTUlODIlOEUlQjIlRTglRjQ0JUNGJUVCQSVFNSVC
OSVDMCVCRiUyOCU4QSVFMiVFQyVFQyVFOSUxM04lMjYlODMxTSVDMyVGMXIlQkN1JUE4JUREdiVFOCVGMCVGQ1JMJTg4JUI3JUI0VW54JTFEJUFDViVBMSVCQiVGMiU5QyUwOSU5OSUxMHclRDUlQUQlRUI2JUJBTiVDNVAlQzUlQzAlRjElN0IlODYlOEElMEQlMjUlQjRzRSVFOCVDNiVEQiVEMiU1QiVCN3dwJUEwJUFD
JTI4JThBJURGJUYxJUMzJTBEJUQ0
//&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&<<[UnmodifiableBlock.End]::Coder Dialog Data::>>*/
?>